/*
 * Copyright 2002-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.aopalliance.intercept;

import java.lang.reflect.AccessibleObject;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

/**
 * 这个接口代表一个通用的运行时连接点（在AOP术语）
 *
 *
 * 运行时连接点是一个<i>事件</i>，它发生在一个静态的连接点（即程序中的一个位置）上发生的事件。
 * 例如，一个调用是一个方法（静态连接点）上的运行时连接点。
 * 一个给定的连接点的静态部分可以被一般性地检索到使用{@link #getStaticPart()}方法。
 *
 * 在拦截框架的背景下，一个运行时连接点是对一个可访问对象（一个*方法、一个构造函数、一个字段）的访问的重化。
 * 方法、构造函数、字段）的访问，即连接点的静态部分。
 * 连接点的静态部分。它被传递给安装在静态连接点上的拦截器。
 * 静态连接点上的拦截器。
 *
 * @author Rod Johnson
 * @see Interceptor
 */
public interface Joinpoint {

	/**
	 * 进入链中的下一个拦截器。
	 * 这个方法的实现和语义取决于实际的连接点类型（见子接口）。
	 * @return 看子类接口的proceed定义
	 * @throws Throwable  如果连接点抛出一个异常
	 */
	@Nullable
	Object proceed() throws Throwable;

	/**
	 * 返回持有当前连接点静态部分的对象。
	 * 例如，一个调用的目标对象。
	 * @return 对象（如果可访问的对象是静态的，可以为空）。
	 */
	@Nullable
	Object getThis();

	/**
	 * 返回这个连接点的静态部分。
	 * 静态部分是一个可访问的对象，其上安装有一连串的
	 * 拦截器被安装在上面。
	 */
	@Nonnull
	AccessibleObject getStaticPart();

}
